package com.coder.algorithm.offer_2;

import java.util.Arrays;
import java.util.Locale;
import java.util.function.Predicate;

/**
 * 调整数组顺序使奇数位于偶数前面
 *
 * @author yuhushuan
 * @date 2020/6/17 22:47
 */
public class _21_1_ReorderArray {
    private static void reorderOddEven(int[] array, Predicate<Integer> func) {
        if (array == null || array.length <= 1) {
            return;
        }
        int start = 0;
        int end = array.length - 1;
        while (start < end) {
            while (start < end && func.test(array[start])) {// 奇数
                ++start;
            }
            while (start < end && !func.test(array[end])) {// 偶数
                --end;
            }
            if (start < end) {// swap
                int temp = array[start];
                array[start] = array[end];
                array[end] = temp;

                ++start;
                --end;
            }
        }
    }

    private static boolean isOdd(int value) {
        return (value & 0x1) == 1;
    }

    /*************** 测试 ******************/
    public static void main(String[] args) {
        // 功能测试

        // 数组中的奇数、偶数、交替出现
        print(new int[]{1, 2, 3, 4, 5, 6});
        // 所有偶数都出现在奇数的前面
        print(new int[]{2, 4, 6, 8, 1, 3, 5, 7});
        // 所有奇数都出现在偶数的前面
        print(new int[]{1, 3, 5, 7, 2, 4, 6, 8});

        // 特殊输入测试
        print(null);
        print(new int[]{2});
    }

    static void print(int[] array) {
        System.out.println(String.format(Locale.getDefault(), "数组：\n%s", Arrays.toString(array)));
        reorderOddEven(array, _21_1_ReorderArray::isOdd);
        System.out.println(String.format(Locale.getDefault(), "排序后：\n%s", Arrays.toString(array)));
        System.out.println();
    }
}
